Skip to content

docs: ADR 0050 — distributed tracing instrumentation with OpenTelemetry - #1489

Merged
ralphbean merged 1 commit into
fullsend-ai:mainfrom
ascerra:docs/adr-0040-tracing
Jun 18, 2026
Merged

docs: ADR 0050 — distributed tracing instrumentation with OpenTelemetry#1489
ralphbean merged 1 commit into
fullsend-ai:mainfrom
ascerra:docs/adr-0040-tracing

Conversation

@ascerra

@ascerra ascerra commented May 26, 2026

Copy link
Copy Markdown
Contributor

Summary

Adds ADR 0048 recording the architectural decision to instrument fullsend with OpenTelemetry using a three-level opt-in model. Includes an infrastructure guide for operators.

What's in this PR

  • docs/ADRs/0048-distributed-tracing-instrumentation.md — the ADR, focused on the single decision: how fullsend produces traces
  • docs/guides/infrastructure/distributed-tracing.md — operator guide covering configuration, env var precedence, local dev setup, and content capture warnings
  • Cross-reference updates in architecture.md, operational-observability.md, and ADR 0021

Three-level opt-in model (the core decision)

Level Trigger Data Risk
1 — Local baseline Always on run-events.jsonl, run-summary.json (metadata only) None
2 — OTLP export OTEL_EXPORTER_OTLP_ENDPOINT set Metadata spans to any OTLP backend Low (no content)
3 — Content capture OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT=true Full prompts/completions in spans High (explicit opt-in required)

What this ADR does NOT decide

  • Which observability backend to use (MLflow, Jaeger, Datadog, etc.)
  • Agent quality evaluation (scoring, regression detection, baselines)
  • Transcript-to-span promotion strategy
  • Cost attribution or billing

Review bot findings addressed

  • Heading/frontmatter number mismatch → fixed (now consistently 48)
  • Multi-endpoint claim → clarified (OTEL Collector fans out, not multi-endpoint config)
  • FULLSEND_TELEMETRY=1 ambiguity → clarified (needed outside GHA for structured recording)
  • ADR 0021 stale cross-ref → annotated ("subsequently decided in ADR 0048")

Addresses reviewer feedback from

  • @ralphbean — env var precedence, runtime agnosticism, scope clarity (approved)
  • @maruiz93 — GenAI semantic conventions, content sensitivity, metadata-only default

@ralphbean ralphbean left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A couple things to sort out — see inline.

Comment thread docs/ADRs/0040-distributed-tracing-instrumentation.md Outdated
Comment thread docs/guides/admin/distributed-tracing.md Outdated
Comment thread docs/guides/admin/distributed-tracing.md Outdated
Comment thread docs/guides/admin/distributed-tracing.md Outdated

@maruiz93 maruiz93 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Retracted — posted prematurely, will follow up with a proper inline review.

Comment thread docs/ADRs/0040-distributed-tracing-instrumentation.md Outdated
Comment thread docs/ADRs/0040-distributed-tracing-instrumentation.md Outdated
Comment thread docs/ADRs/0040-distributed-tracing-instrumentation.md Outdated
Comment thread docs/ADRs/0040-distributed-tracing-instrumentation.md Outdated
Comment thread docs/ADRs/0040-distributed-tracing-instrumentation.md Outdated
Comment thread docs/guides/admin/distributed-tracing.md Outdated
Comment thread docs/guides/admin/distributed-tracing.md Outdated
Comment thread docs/guides/admin/distributed-tracing.md Outdated
@ascerra
ascerra force-pushed the docs/adr-0040-tracing branch from c11a17b to 2c1189b Compare June 16, 2026 19:13
@ascerra

ascerra commented Jun 16, 2026

Copy link
Copy Markdown
Contributor Author

Revision: ADR refactored and narrowed

Based on team discussion (June 11 sync) and reviewer feedback, this PR has been substantially refactored:

What changed

  • ADR renumbered 0040 → 0046 (0040 collides with 0040-org-pool-for-parallel-e2e-tests.md on main)
  • ADR rewritten from 225 → 123 lines — now focuses solely on the architectural decision: fullsend instruments with OpenTelemetry using a three-level opt-in model
  • Three-level content sensitivity model added (per OTEL GenAI semantic conventions):
    • Level 1: Local files always (zero config, metadata only)
    • Level 2: OTLP metadata export (org sets endpoint)
    • Level 3: Content capture (org explicitly opts in with OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT)
  • Explicit scope boundary — evals consume traces but are a separate concern
  • Option C added (vendor-specific, rejected) — clarifies why we chose OTEL over runtime-locked formats
  • Admin guide moved docs/guides/admin/docs/guides/infrastructure/
  • Admin guide rewritten — added env var precedence docs, local dev section, content capture warning; removed MLflow VM details, live run links, InstrumentedPrinter internals

What was removed from the ADR (→ belongs elsewhere)

  • InstrumentedPrinter architecture
  • telemetry_lint_test.go regression gates
  • Transcript-to-span promotion details
  • MLflow infrastructure specifics
  • Live deployment example / run links
  • GHA workflow YAML examples

These remain documented in the implementation reference (docs/guides/admin/distributed-tracing-implementation.md) for team use.

Reviewer feedback addressed

All [request-changes] items from both reviewers are resolved in this revision. See individual replies below.

@github-actions

Copy link
Copy Markdown

E2E tests did not run

E2E tests run automatically for org/repo members and collaborators on pull requests.

For other contributors, a maintainer must add the ok-to-test label after the latest push.

See E2E testing guide for details.

@fullsend-ai-review

fullsend-ai-review Bot commented Jun 16, 2026

Copy link
Copy Markdown

🤖 Review · ⚠️ Cancelled · Started 7:18 PM UTC · Ended 7:20 PM UTC
Commit: 4e21a60 · View workflow run →

@ascerra
ascerra force-pushed the docs/adr-0040-tracing branch from 2c1189b to ac20880 Compare June 16, 2026 19:18
@ascerra ascerra changed the title docs: ADR 0040 — framework-native distributed tracing with OpenTelemetry docs: ADR 0046 — distributed tracing instrumentation with OpenTelemetry Jun 16, 2026
@github-actions

github-actions Bot commented Jun 16, 2026

Copy link
Copy Markdown

Site preview

Preview: https://5a69e356-site.fullsend-ai.workers.dev

Commit: a777a5dbded07884288e2ad2f16c7dd34273883a

@fullsend-ai-review

fullsend-ai-review Bot commented Jun 16, 2026

Copy link
Copy Markdown

🤖 Review · ⚠️ Cancelled · Started 7:23 PM UTC · Ended 7:25 PM UTC
Commit: 4e21a60 · View workflow run →

@ascerra
ascerra force-pushed the docs/adr-0040-tracing branch from ac20880 to 8dcd48b Compare June 16, 2026 19:23
@ascerra ascerra changed the title docs: ADR 0046 — distributed tracing instrumentation with OpenTelemetry docs: ADR 0047 — distributed tracing instrumentation with OpenTelemetry Jun 16, 2026
@ascerra
ascerra force-pushed the docs/adr-0040-tracing branch from 8dcd48b to 640d2c9 Compare June 16, 2026 19:25
@ascerra
ascerra marked this pull request as ready for review June 16, 2026 19:26
@fullsend-ai-review

fullsend-ai-review Bot commented Jun 16, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 7:30 PM UTC · Completed 7:45 PM UTC
Commit: 640d2c9 · View workflow run →

@codecov

codecov Bot commented Jun 16, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@fullsend-ai-review

fullsend-ai-review Bot commented Jun 16, 2026

Copy link
Copy Markdown

Review

Findings

Low

  • [scope-coherence] docs/ADRs/0021-jsonl-reasoning-trace-exposure.md:165 — Edit to Accepted ADR 0021 replaces "a future decision, not in scope here" with "subsequently decided in [ADR 0050]". This is a cross-reference annotation permitted by AGENTS.md, but the edit replaces the original scoping framing rather than appending to it. Preserving both would be more faithful to the point-in-time record.
    Remediation: Consider rewording to: "a future decision, not in scope here — subsequently decided in ADR 0050."

  • [ADR-frontmatter-consistency] docs/ADRs/0050-distributed-tracing-instrumentation.md — The ADR template (0000) includes an HTML comment block after the Status section explaining ADR mutability policy. ADR 0050 omits this comment. The pattern is not universal across all existing ADRs but is recommended by the template.

Info

Previous run

Review

Findings

Critical

  • [naming-collision] docs/ADRs/0049-distributed-tracing-instrumentation.md — ADR number 0049 is already taken. The repository contains docs/ADRs/0049-agent-configuration-env-var-convention.md (accepted, dated 2026-06-16) on main. This PR introduces a second, unrelated ADR 0049. All cross-references to ADR 0049 throughout the repository (currently docs/architecture.md:98 references the env-var convention ADR) become ambiguous. When this PR merges, the repo will contain two files with the same ADR number, and the existing reference will point to the wrong decision.
    Remediation: Renumber the distributed tracing ADR to 0050 (the next available number). Update all references introduced by this PR: docs/ADRs/0021-jsonl-reasoning-trace-exposure.md, docs/architecture.md, docs/guides/infrastructure/distributed-tracing.md, docs/problems/operational-observability.md, and the ADR's own title, heading, and filename.

Low

  • [internal-consistency] docs/architecture.md:204 — The struck-through open question's answer states "volume is managed by backends not by suppressing data at the source." ADR 0049's design suppresses content at the source by default (Levels 1–2 are metadata-only; content capture requires explicit opt-in). The phrasing is defensible if "data" refers to structural tracing spans rather than content, but the ambiguity could mislead readers.
    Remediation: Clarify the annotation to distinguish span volume (managed by backends) from content suppression (managed at the source via opt-in levels).

  • [scope-coherence] docs/ADRs/0021-jsonl-reasoning-trace-exposure.md:165 — Edit to Accepted ADR 0021 changes "a future decision, not in scope here" to "subsequently decided in [ADR 0049]". This is a cross-reference annotation permitted by AGENTS.md. Preserving the original scoping framing alongside the forward reference would be slightly more faithful to the point-in-time record (e.g., "a future decision — subsequently decided in [ADR 0049]").

Info


Labels: PR adds a new ADR and infrastructure guide — purely documentation changes.

Previous run (2)

Review

Findings

Low

  • [missing-authorization] — This PR has no formally linked GitHub issue. The ADR's "Related issues" section references Define trace granularity and retention policy for agent reasoning traces #294, Define quality metrics for autonomous software factory #295, Evaluate Langfuse deployment threshold vs structured logging #296, feat: add fullsend.runtime trace attribute for multi-runtime observability #2367, feat: add fullsend.harness.content_sha trace attribute for config change correlation #2368, but none are linked to the PR via GitHub's linking mechanism. This is a minor traceability gap rather than a blocking concern — the repo has no policy requiring linked issues, and the PR body provides adequate context.
    Remediation: Link one of the referenced issues to the PR for traceability.

  • [internal-consistency] docs/architecture.md:199 — The struck-through open question's answer states "volume is managed by backends not by suppressing data at the source." ADR 0049's design suppresses content at the source by default (Levels 1–2 are metadata-only; content capture requires explicit opt-in). The phrasing is defensible if "data" refers to structural tracing spans rather than content, but the ambiguity could mislead readers.
    Remediation: Clarify the annotation to distinguish span volume (managed by backends) from content suppression (managed at the source via opt-in levels).

  • [section-naming] docs/ADRs/0049-distributed-tracing-instrumentation.md — ADR uses section names "Deferred to implementation" and "Related issues" which do not match established patterns. Analysis of existing ADRs shows "References" is the standard end section name (used in 6 ADRs). No existing ADR uses these section names.
    Remediation: Rename "Related issues" to "References" to match the established pattern.

  • [scope-coherence] docs/ADRs/0021-jsonl-reasoning-trace-exposure.md:165 — Edit to Accepted ADR 0021 changes "a future decision, not in scope here" to "subsequently decided in [ADR 0049]". This is a cross-reference annotation permitted by AGENTS.md. Preserving the original scoping framing alongside the forward reference would be slightly more faithful to the point-in-time record (e.g., "a future decision — subsequently decided in [ADR 0049]").

Info

  • [internal-consistency] docs/problems/operational-observability.md:195 — The bootstrapping question's answer claims zero-configuration baseline "eliminates infrastructure requirements for initial observability." This is accurate for backend infrastructure but does not fully address the original question's broader scope (which included the effort to build the instrumentation itself). The answer is defensible but slightly reductive.
Previous run (3)

Review

Findings

Low

  • [internal-consistency] docs/architecture.md:199 — The struck-through open question's answer states "volume is managed by backends not by suppressing data at the source." ADR 0049's design suppresses content at the source by default (Levels 1–2 are metadata-only; content capture requires explicit opt-in). The answer is partially correct — backends do manage aggregate span volume — but the phrase "not by suppressing data at the source" contradicts the content-suppression model central to the ADR.
    Remediation: Clarify the annotation to acknowledge metadata-only defaults, e.g., "instrument all lifecycle steps comprehensively with metadata-only spans by default; content capture requires explicit opt-in. Backend-side retention and sampling manage aggregate volume."

  • [section-naming] docs/ADRs/0049-distributed-tracing-instrumentation.md — ADR uses section names "Deferred to implementation" and "Related issues" which differ from the most common pattern ("References", "Open questions"). Existing ADRs show some variation (e.g., ADR 0033 uses "Resolved Questions", ADR 0036 uses "Implementation Details"), so this is a loose convention rather than a strict rule. Renaming "Related issues" to "References" would improve consistency.

  • [scope-coherence] docs/ADRs/0021-jsonl-reasoning-trace-exposure.md:165 — Edit to Accepted ADR 0021 changes "a future decision, not in scope here" to "subsequently decided in [ADR 0049]". This is a cross-reference annotation permitted by AGENTS.md. The replacement text is factually accurate, though preserving the original scoping framing alongside the forward reference would be slightly more faithful to the point-in-time record.

Info

  • [internal-consistency] docs/problems/operational-observability.md:195 — The bootstrapping question's answer claims zero-configuration baseline "eliminates infrastructure requirements for initial observability." This is accurate for backend infrastructure but does not fully address the original question's broader scope (which included the effort to build the instrumentation itself). The answer is defensible but slightly reductive.
Previous run (4)

Review

Findings

Medium

Low

  • [scope-coherence] docs/ADRs/0021-jsonl-reasoning-trace-exposure.md:165 — Edit to an Accepted ADR on main changes "a future decision, not in scope here" to "subsequently decided in [ADR 0049]". This updates a forward-looking statement with a cross-reference to the ADR that resolved it. AGENTS.md explicitly allows cross-reference annotations, so this is permissible, though preserving both the original framing and the forward reference would be slightly more faithful to the point-in-time record (e.g., "a future decision, not in scope here — subsequently decided in [ADR 0049]").

  • [internal-consistency] docs/problems/operational-observability.md:195 — The struck-through bootstrapping question claims ADR 0049's zero-configuration baseline "eliminates infrastructure requirements for initial observability." This is accurate for backend infrastructure, but the original question was broader — it also covered the effort to build the instrumentation itself, not just the backend. The answer is defensible but slightly reductive.

Info

  • [section-naming] docs/ADRs/0049-distributed-tracing-instrumentation.md — ADR uses section names "Deferred to implementation" and "Related issues" which differ from established patterns in other ADRs ("Open questions", "References"). Consider renaming for consistency, though the current names do convey distinct meaning.
Previous run (5)

Review

Findings

Low

  • [internal-consistency] docs/guides/infrastructure/distributed-tracing.md:39 — The guide states "Setting FULLSEND_TELEMETRY=1 is only required when running outside GitHub Actions to enable span timing and structured event recording in the local files." This contradicts ADR 0048, which describes Level 1 as "every install, zero config" and states that every run produces run-events.jsonl and run-summary.json unconditionally.

  • [missing-index-entry] docs/guides/README.md:17 — The guides index lists infrastructure guides but does not include the new distributed-tracing.md operator guide being added in this PR.
    Remediation: Add an entry under the Infrastructure section.

  • [cross-reference-verb-choice] docs/problems/operational-observability.md:195 — Cross-reference verb inconsistency within this PR.
    Remediation: Change "Addressed in" to "Decided in" for consistency.

Info

  • [section-naming] docs/ADRs/0048-distributed-tracing-instrumentation.md — ADR 0048 uses section names "Deferred to implementation" and "Related issues" which are not part of the standard ADR template.

  • [cross-reference-format] docs/ADRs/0048-distributed-tracing-instrumentation.md — The "Related issues" section uses a bulleted list of issue links with brief descriptions.

Previous run (6)

Review

Findings

Medium

  • [missing-authorization] docs/ADRs/0048-distributed-tracing-instrumentation.md — Non-trivial documentation change has no linked issue.

Low

  • [internal-consistency] docs/guides/infrastructure/distributed-tracing.md:44 — Duplicated paragraph (copy-paste error).

  • [internal-consistency] docs/guides/infrastructure/distributed-tracing.md:39 — Tension between ADR 0048 and the guide regarding "zero config."

  • [missing-index-entry] docs/guides/README.md:17 — Missing guides index entry.

  • [cross-reference-verb-choice] docs/problems/operational-observability.md — Cross-reference verb inconsistency.

Info

  • [section-naming] docs/ADRs/0048-distributed-tracing-instrumentation.md — Non-standard ADR section names.
Previous run (7)

Review

Findings

Medium

  • [missing-authorization] docs/ADRs/0048-distributed-tracing-instrumentation.md — Non-trivial documentation change has no linked issue.

Low

  • [internal-consistency] docs/guides/infrastructure/distributed-tracing.md:44 — Duplicated paragraph.

  • [internal-consistency] docs/guides/infrastructure/distributed-tracing.md:39 — ADR vs guide tension on "zero config."

  • [missing-index-entry] docs/guides/README.md:17 — Missing guides index entry.

  • [cross-reference-verb-choice] docs/problems/operational-observability.md — Verb inconsistency.

Info

  • [section-naming] docs/ADRs/0048-distributed-tracing-instrumentation.md — Non-standard ADR section names.
Previous run (8)

Review

Findings

Medium

  • [missing-authorization] docs/ADRs/0047-distributed-tracing-instrumentation.md — Non-trivial documentation change with no linked issue.

Low

  • [internal-consistency] docs/ADRs/0047-distributed-tracing-instrumentation.md:12 — Heading/frontmatter number mismatch (46 vs 47).

  • [internal-consistency] docs/ADRs/0047-distributed-tracing-instrumentation.md:89 — Multi-endpoint claim not documented in guide.

  • [edge-case] docs/guides/infrastructure/distributed-tracing.md:40 — FULLSEND_TELEMETRY=1 vs zero-config ambiguity.

  • [stale-doc] docs/ADRs/0021-jsonl-reasoning-trace-exposure.md:163 — Missing cross-reference to new ADR.

Info

  • [scope-verification] docs/architecture.md:199 — Related granularity question still open.
Previous run (9)

Review

Findings

Low

  • [missing-authorization] — This PR has no formally linked GitHub issue. The ADR's "Related issues" section references Define trace granularity and retention policy for agent reasoning traces #294, Define quality metrics for autonomous software factory #295, Evaluate Langfuse deployment threshold vs structured logging #296, feat: add fullsend.runtime trace attribute for multi-runtime observability #2367, feat: add fullsend.harness.content_sha trace attribute for config change correlation #2368, but none are linked to the PR via GitHub's linking mechanism. This is a minor traceability gap rather than a blocking concern — the repo has no policy requiring linked issues, and the PR body provides adequate context.
    Remediation: Link one of the referenced issues to the PR for traceability.

  • [internal-consistency] docs/architecture.md:199 — The struck-through open question's answer states "volume is managed by backends not by suppressing data at the source." ADR 0049's design suppresses content at the source by default (Levels 1–2 are metadata-only; content capture requires explicit opt-in). The phrasing is defensible if "data" refers to structural tracing spans rather than content, but the ambiguity could mislead readers.
    Remediation: Clarify the annotation to distinguish span volume (managed by backends) from content suppression (managed at the source via opt-in levels).

  • [section-naming] docs/ADRs/0049-distributed-tracing-instrumentation.md — ADR uses section names "Deferred to implementation" and "Related issues" which do not match established patterns. Analysis of existing ADRs shows "References" is the standard end section name (used in 6 ADRs). No existing ADR uses these section names.
    Remediation: Rename "Related issues" to "References" to match the established pattern.

  • [scope-coherence] docs/ADRs/0021-jsonl-reasoning-trace-exposure.md:165 — Edit to Accepted ADR 0021 changes "a future decision, not in scope here" to "subsequently decided in [ADR 0049]". This is a cross-reference annotation permitted by AGENTS.md. Preserving the original scoping framing alongside the forward reference would be slightly more faithful to the point-in-time record (e.g., "a future decision — subsequently decided in [ADR 0049]").

Info

  • [internal-consistency] docs/problems/operational-observability.md:195 — The bootstrapping question's answer claims zero-configuration baseline "eliminates infrastructure requirements for initial observability." This is accurate for backend infrastructure but does not fully address the original question's broader scope (which included the effort to build the instrumentation itself). The answer is defensible but slightly reductive.
Previous run (10)

Review

Findings

Low

  • [internal-consistency] docs/architecture.md:199 — The struck-through open question's answer states "volume is managed by backends not by suppressing data at the source." ADR 0049's design suppresses content at the source by default (Levels 1–2 are metadata-only; content capture requires explicit opt-in). The answer is partially correct — backends do manage aggregate span volume — but the phrase "not by suppressing data at the source" contradicts the content-suppression model central to the ADR.
    Remediation: Clarify the annotation to acknowledge metadata-only defaults, e.g., "instrument all lifecycle steps comprehensively with metadata-only spans by default; content capture requires explicit opt-in. Backend-side retention and sampling manage aggregate volume."

  • [section-naming] docs/ADRs/0049-distributed-tracing-instrumentation.md — ADR uses section names "Deferred to implementation" and "Related issues" which differ from the most common pattern ("References", "Open questions"). Existing ADRs show some variation (e.g., ADR 0033 uses "Resolved Questions", ADR 0036 uses "Implementation Details"), so this is a loose convention rather than a strict rule. Renaming "Related issues" to "References" would improve consistency.

  • [scope-coherence] docs/ADRs/0021-jsonl-reasoning-trace-exposure.md:165 — Edit to Accepted ADR 0021 changes "a future decision, not in scope here" to "subsequently decided in [ADR 0049]". This is a cross-reference annotation permitted by AGENTS.md. The replacement text is factually accurate, though preserving the original scoping framing alongside the forward reference would be slightly more faithful to the point-in-time record.

Info

  • [internal-consistency] docs/problems/operational-observability.md:195 — The bootstrapping question's answer claims zero-configuration baseline "eliminates infrastructure requirements for initial observability." This is accurate for backend infrastructure but does not fully address the original question's broader scope (which included the effort to build the instrumentation itself). The answer is defensible but slightly reductive.
Previous run (11)

Review

Findings

Medium

Low

  • [scope-coherence] docs/ADRs/0021-jsonl-reasoning-trace-exposure.md:165 — Edit to an Accepted ADR on main changes "a future decision, not in scope here" to "subsequently decided in [ADR 0049]". This updates a forward-looking statement with a cross-reference to the ADR that resolved it. AGENTS.md explicitly allows cross-reference annotations, so this is permissible, though preserving both the original framing and the forward reference would be slightly more faithful to the point-in-time record (e.g., "a future decision, not in scope here — subsequently decided in [ADR 0049]").

  • [internal-consistency] docs/problems/operational-observability.md:195 — The struck-through bootstrapping question claims ADR 0049's zero-configuration baseline "eliminates infrastructure requirements for initial observability." This is accurate for backend infrastructure, but the original question was broader — it also covered the effort to build the instrumentation itself, not just the backend. The answer is defensible but slightly reductive.

Info

  • [section-naming] docs/ADRs/0049-distributed-tracing-instrumentation.md — ADR uses section names "Deferred to implementation" and "Related issues" which differ from established patterns in other ADRs ("Open questions", "References"). Consider renaming for consistency, though the current names do convey distinct meaning.
Previous run (12)

Review

Findings

Low

  • [internal-consistency] docs/guides/infrastructure/distributed-tracing.md:39 — The guide states "Setting FULLSEND_TELEMETRY=1 is only required when running outside GitHub Actions to enable span timing and structured event recording in the local files." This contradicts ADR 0048, which describes Level 1 as "every install, zero config" and states that every run produces run-events.jsonl and run-summary.json unconditionally. If FULLSEND_TELEMETRY=1 is required outside GHA for local file production, then Level 1 is not "zero config" for non-GHA environments. Consider qualifying the zero-config claim in the ADR (e.g., "zero config in CI") or clarifying in the guide what FULLSEND_TELEMETRY=1 enables beyond the unconditional baseline.

  • [missing-index-entry] docs/guides/README.md:17 — The guides index lists infrastructure guides but does not include the new distributed-tracing.md operator guide being added in this PR.
    Remediation: Add an entry under the Infrastructure section: - [Distributed tracing](infrastructure/distributed-tracing.md) — Configuring OpenTelemetry instrumentation and OTLP backends

  • [cross-reference-verb-choice] docs/problems/operational-observability.md:195 — Cross-reference verb inconsistency within this PR: architecture.md uses "Decided in [ADR 0048]" but operational-observability.md uses "Addressed in [ADR 0048]". The established pattern throughout the repo (6 occurrences across 5 files) is "Decided in".
    Remediation: Change "Addressed in" to "Decided in" for consistency.

Info

  • [section-naming] docs/ADRs/0048-distributed-tracing-instrumentation.md — ADR 0048 uses section names "Deferred to implementation" and "Related issues" which are not part of the standard ADR template. These sections serve distinct purposes from the conventional "References" section — "Deferred to implementation" captures scope boundaries rather than external references — so they may be intentional additions to the template.

  • [cross-reference-format] docs/ADRs/0048-distributed-tracing-instrumentation.md — The "Related issues" section uses a bulleted list of issue links with brief descriptions. Other ADRs integrate issue references into narrative text within the Consequences section. Each entry does include a descriptive phrase, so the relationship is not entirely unclear.

Previous run (13)

Review

Findings

Medium

Low

  • [internal-consistency] docs/guides/infrastructure/distributed-tracing.md:44 — The paragraph beginning "Local files (run-events.jsonl, run-summary.json) are always produced" is duplicated verbatim. The same four-line block appears at lines 38–41 and again at lines 44–47. This appears to be a copy-paste error.

  • [internal-consistency] docs/guides/infrastructure/distributed-tracing.md:39 — Tension between ADR 0048 and the guide regarding "zero config." ADR 0048 states Level 1 requires "zero config" for every install, but the guide says "Setting FULLSEND_TELEMETRY=1 is only required when running outside GitHub Actions to enable span timing and structured event recording in the local files; inside GHA it is set automatically by the reusable workflows." This means Level 1 is not zero-config for local/non-GHA usage — it requires an env var. Consider qualifying the zero-config claim in the ADR (e.g., "zero config in CI") or clarifying in the guide that local files are always written but span timing requires the env var.

  • [missing-index-entry] docs/guides/README.md:17 — The guides index lists infrastructure guides but does not include the new distributed-tracing.md operator guide being added in this PR.
    Remediation: Add an entry for the distributed tracing guide in the Infrastructure section of docs/guides/README.md.

  • [cross-reference-verb-choice] docs/problems/operational-observability.md — Cross-reference verb inconsistency. The PR uses "Addressed in [ADR 0048]" to strike through the bootstrapping question, but the existing pattern in the same file at line 190 uses "Decided in [ADR 0041]". Consider using "Decided in" for consistency, though "Addressed in" may be intentionally softer if the ADR mitigates rather than fully resolves the question.

Info

  • [section-naming] docs/ADRs/0048-distributed-tracing-instrumentation.md — ADR 0048 uses section names "Deferred to implementation" and "Related issues" which are not part of the standard ADR template (Context, Options, Decision, Consequences). Other ADRs use "References" for similar content. These sections are novel but not necessarily wrong.
Previous run (14)

Review

Findings

Medium

Low

  • [internal-consistency] docs/guides/infrastructure/distributed-tracing.md:44 — The paragraph beginning "Local files (run-events.jsonl, run-summary.json) are always produced" is duplicated verbatim. The same four-line block appears at lines 38–41 and again at lines 44–47. This appears to be a copy-paste error.

  • [internal-consistency] docs/guides/infrastructure/distributed-tracing.md:39 — Tension between ADR 0048 and the guide regarding "zero config." ADR 0048 states Level 1 requires "zero config" for every install, but the guide says "Setting FULLSEND_TELEMETRY=1 is only required when running outside GitHub Actions to enable span timing and structured event recording in the local files." This means Level 1 is not zero-config for local/non-GHA usage — it requires an env var. Consider qualifying the zero-config claim in the ADR (e.g., "zero config in CI") or clarifying in the guide that local files are always written but span timing requires the env var.

  • [missing-index-entry] docs/guides/README.md:17 — The guides index lists infrastructure guides but does not include the new distributed-tracing.md operator guide being added in this PR.
    Remediation: Add an entry for the distributed tracing guide in the Infrastructure section of docs/guides/README.md.

  • [cross-reference-verb-choice] docs/problems/operational-observability.md — Cross-reference verb inconsistency. The PR uses "Addressed in [ADR 0048]" to strike through the bootstrapping question, but the existing pattern in the same file at line 190 uses "Decided in [ADR 0041]". Consider using "Decided in" for consistency, though "Addressed in" may be intentionally softer if the ADR mitigates rather than fully resolves the question.

Info

  • [section-naming] docs/ADRs/0048-distributed-tracing-instrumentation.md — ADR 0048 uses section names "Deferred to implementation" and "Related issues" which are not part of the standard ADR template (Context, Options, Decision, Consequences). Other ADRs use "References" for similar content. These sections are novel but not necessarily wrong.
Previous run (15)

Review

Findings

Medium

Low

  • [internal-consistency] docs/ADRs/0047-distributed-tracing-instrumentation.md:12 — The YAML front-matter title says "47." but the markdown heading on line 12 says # 46. Framework-native distributed tracing with OpenTelemetry. The file is named 0047 and frontmatter says 47, but the heading says 46.
    Remediation: Change line 12 from # 46. to # 47.

  • [internal-consistency] docs/ADRs/0047-distributed-tracing-instrumentation.md:89 — The ADR Decision section says "Telemetry destination configuration accepts a list of OTLP endpoints, enabling simultaneous export to multiple backends." However, the operator guide only describes the standard OTEL_EXPORTER_OTLP_ENDPOINT and OTEL_EXPORTER_OTLP_TRACES_ENDPOINT env vars, which accept a single value per the OpenTelemetry specification. There is no mention of a multi-endpoint mechanism in the guide.
    Remediation: Either (a) remove the multi-endpoint claim from the ADR, (b) document the concrete mechanism in the guide, or (c) clarify that multi-backend export is achieved via an OTEL Collector deployed by the adopter.

  • [edge-case] docs/guides/infrastructure/distributed-tracing.md:40 — The guide introduces FULLSEND_TELEMETRY=1 as enabling telemetry recording without an OTLP endpoint, but the ADR's Level 1 says local files are always produced with zero config. If Level 1 truly requires zero configuration, then FULLSEND_TELEMETRY=1 is either redundant or implies Level 1 is not truly zero-config in some scenarios.
    Remediation: Clarify what FULLSEND_TELEMETRY=1 enables beyond the zero-config baseline, or remove it if redundant.

  • [stale-doc] docs/ADRs/0021-jsonl-reasoning-trace-exposure.md:163 — ADR 0021 lines 163–165 state: "Complementary structured extraction via OpenTelemetry could power aggregate analysis at scale... — a future decision, not in scope here." ADR 0047 now addresses OTel instrumentation. A minor cross-reference annotation would help readers.
    Remediation: Add a minor annotation near line 165, e.g., "(Subsequently decided in [ADR 0047].)" — permitted as a cross-reference annotation under ADR immutability rules.

Info

  • [scope-verification] docs/architecture.md:199 — The PR strikes through the tracing-vs-volume open question in architecture.md but the closely related granularity question in operational-observability.md remains open. These are slightly different questions (volume management vs. granularity), so this is internally consistent but worth noting.

@fullsend-ai-review fullsend-ai-review Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See the review comment for full details.

- opentelemetry
---

# 46. Framework-native distributed tracing with OpenTelemetry

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[low] internal-consistency

YAML front-matter title says 47 but the markdown heading says 46 — should be 47 to match.

Suggested fix: Change line 12 from # 46. to # 47.

appropriate for the content sensitivity
- Enables LLM-judge evaluation scorers that need to read agent reasoning

**Additional design properties:**

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[low] internal-consistency

ADR claims multi-endpoint support but the guide only documents single-endpoint env vars per the OTEL specification.

Suggested fix: Either remove the multi-endpoint claim, document the mechanism in the guide, or clarify that multi-backend export requires an OTEL Collector.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Noted, non-blocking. I think we should be explicit that multi-backend export needs an OTEL Collector as a fan-out proxy — the standard env vars take a single URL.


Setting `FULLSEND_TELEMETRY=1` enables telemetry recording even without an
OTLP endpoint (local files only, useful for testing).

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[low] edge-case

FULLSEND_TELEMETRY=1 purpose is ambiguous relative to the ADR zero-config Level 1 baseline that always produces local files.

Suggested fix: Clarify what FULLSEND_TELEMETRY=1 enables beyond the zero-config baseline, or remove if redundant.

Comment thread docs/architecture.md

**Open questions:**

- What signals matter most — cost, latency, token usage, action logs, decision traces, or something else?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[info] scope-verification

The tracing-vs-volume question is struck through in architecture.md but the related granularity question in operational-observability.md remains open. Internally consistent but worth noting.

@fullsend-ai-review fullsend-ai-review Bot added the requires-manual-review Review requires human judgment label Jun 16, 2026

@ralphbean ralphbean left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Prior feedback addressed. +1'd a few of the bot's inline notes (non-blocking).

@ascerra
ascerra force-pushed the docs/adr-0040-tracing branch from 640d2c9 to fd20d36 Compare June 16, 2026 21:00
@ascerra ascerra changed the title docs: ADR 0047 — distributed tracing instrumentation with OpenTelemetry docs: ADR 0048 — distributed tracing instrumentation with OpenTelemetry Jun 16, 2026
@fullsend-ai-review fullsend-ai-review Bot added ready-for-merge All reviewers approved — ready to merge and removed ready-for-merge All reviewers approved — ready to merge labels Jun 18, 2026
@ralphbean
ralphbean dismissed maruiz93’s stale review June 18, 2026 14:19

I think all of Marta's concerns were addressed. I want to get this in, so that #2423 can be rebased on it.

@ralphbean
ralphbean added this pull request to the merge queue Jun 18, 2026
@ralphbean

Copy link
Copy Markdown
Member

fwiw, I think implementation of this ADR is lower priority than the feature refinement work.

@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Jun 18, 2026
@ralphbean
ralphbean enabled auto-merge June 18, 2026 18:01
@fullsend-ai-review

fullsend-ai-review Bot commented Jun 18, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 6:05 PM UTC · Completed 6:20 PM UTC
Commit: badd2c5 · View workflow run →

@fullsend-ai-review fullsend-ai-review Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See the review comment for full details.

@@ -0,0 +1,143 @@
---

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[critical] naming-collision

ADR number 0049 is already taken. The repository contains docs/ADRs/0049-agent-configuration-env-var-convention.md (accepted, dated 2026-06-16) on main. This PR introduces a second, unrelated ADR 0049. All cross-references to ADR 0049 throughout the repository (currently docs/architecture.md:98 references the env-var convention ADR) become ambiguous. When this PR merges, the repo will contain two files with the same ADR number. The next available number is 0050.

Suggested fix: Renumber the distributed tracing ADR to 0050. Update all references introduced by this PR: docs/ADRs/0021-jsonl-reasoning-trace-exposure.md, docs/architecture.md, docs/guides/infrastructure/distributed-tracing.md, docs/problems/operational-observability.md, and the ADR own title, heading, and filename.

@fullsend-ai-review fullsend-ai-review Bot added component/docs User-facing documentation and removed ready-for-merge All reviewers approved — ready to merge labels Jun 18, 2026
Add ADR recording the decision to instrument fullsend with OpenTelemetry
using a three-level opt-in model (local files → OTLP metadata export →
content capture). Separates telemetry from evaluation concerns.

Key changes:
- ADR 0048: three-level content sensitivity model per OTEL GenAI spec,
  explicit scope boundary (evals consume traces, separate concern),
  multi-backend via OTEL Collector (not multi-endpoint config)
- Infrastructure guide: env var precedence, local dev section, content
  capture warning; backend-agnostic language throughout
- Cross-reference annotation in ADR 0021 (OTel future → now decided)
- Update cross-references in architecture.md and problem doc

Addresses review feedback from ralphbean, maruiz93, and review bot.

Signed-off-by: Adam Scerra <ascerra@redhat.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Signed-off-by: Adam Scerra <ascerra@redhat.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Signed-off-by: Adam Scerra <ascerra@redhat.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Signed-off-by: Adam Scerra <ascerra@redhat.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Signed-off-by: Adam Scerra <ascerra@redhat.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Signed-off-by: Adam Scerra <ascerra@redhat.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
@ascerra
ascerra force-pushed the docs/adr-0040-tracing branch from badd2c5 to a777a5d Compare June 18, 2026 18:44
@ascerra ascerra changed the title docs: ADR 0049 — distributed tracing instrumentation with OpenTelemetry docs: ADR 0050 — distributed tracing instrumentation with OpenTelemetry Jun 18, 2026
@fullsend-ai-review

fullsend-ai-review Bot commented Jun 18, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 6:47 PM UTC · Completed 7:00 PM UTC
Commit: a777a5d · View workflow run →

@ralphbean
ralphbean added this pull request to the merge queue Jun 18, 2026
human debugging). Complementary structured extraction via OpenTelemetry
could power aggregate analysis at scale (pattern detection across many
runs) — a future decision, not in scope here.
runs) — subsequently decided in [ADR 0050](0050-distributed-tracing-instrumentation.md).

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[low] scope-coherence

Edit to Accepted ADR 0021 replaces a future decision, not in scope here with subsequently decided in [ADR 0050]. Permitted cross-reference annotation but replaces original scoping framing rather than appending.

Suggested fix: Consider rewording to: a future decision, not in scope here — subsequently decided in [ADR 0050].

@@ -0,0 +1,143 @@
---

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[low] ADR-frontmatter-consistency

The ADR template (0000) includes an HTML comment block after the Status section explaining ADR mutability policy. ADR 0050 omits this comment.

Comment thread docs/architecture.md

**Open questions:**

- What signals matter most — cost, latency, token usage, action logs, decision traces, or something else?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[info] internal-consistency

Struck-through question resolution states volume is managed by backends not by suppressing data at the source. Accurate for span volume but readers may conflate volume with content.

@fullsend-ai-review fullsend-ai-review Bot added the ready-for-merge All reviewers approved — ready to merge label Jun 18, 2026
Merged via the queue into fullsend-ai:main with commit 559eb92 Jun 18, 2026
14 checks passed
@fullsend-ai-retro

fullsend-ai-retro Bot commented Jun 18, 2026

Copy link
Copy Markdown

🤖 Finished Retro · ✅ Success · Started 7:26 PM UTC · Completed 7:34 PM UTC
Commit: a777a5d · View workflow run →

@fullsend-ai-retro

Copy link
Copy Markdown

Retro: PR #1489 — ADR 0050 (distributed tracing with OpenTelemetry)

Workflow: Human-authored docs PR by @ascerra, open 23 days (2026-05-26 to 2026-06-18). Received substantive review from two humans (@ralphbean, @maruiz93) and 16 review bot runs (3 cancelled, 1 failure, 12 successful).

What went well

  • The review bot caught a critical ADR number collision (0049 already taken) on 2026-06-18, preventing a broken merge. This was the bot's highest-value contribution on this PR.
  • Human reviewers provided high-quality, substantive feedback — env var precedence, scope clarity, runtime agnosticism, GenAI semantic conventions. The author addressed all of it thoroughly.
  • The consolidated review comment kept a clean history of all 15 prior runs, making it easy to track finding evolution.

Patterns observed (all covered by existing issues)

  1. ADR renumbered 5+ times (0040→0046→0047→0048→0049→0050) due to concurrent merges of other ADRs. The renumber-adr skill exists but was not invoked proactively. Already tracked: Add CI lint check for ADR number collisions against target branch #992 (CI lint check for collisions) and Code agent should auto-invoke renumber-adr when creating ADR files #1570 (code agent auto-invokes renumber-adr).

  2. 16 review bot runs for a docs PR, including 4 runs on the same SHA (4e21a60). Already tracked: Deduplicate review dispatches for the same HEAD SHA #1452 (deduplicate dispatches for same HEAD SHA), Reduce unnecessary re-review runs on large PRs #1390 (reduce unnecessary re-review runs), Debounce review dispatch on rapid synchronize events #1014 (debounce on rapid synchronize events).

  3. Repetitive low-severity findings (scope-coherence on ADR 0021 edit, volume wording, bootstrapping question) persisted across 8+ runs after the author chose not to address them. Already tracked: Review agent should deduplicate findings across iterations on the same PR #1013 (deduplicate findings across iterations), Review agent should honor explicit author dismissals of findings #1672 (honor explicit author dismissals), Review comment should state whether findings changed since prior review #1155 (state whether findings changed since prior review).

  4. "Missing-authorization" flagged as Medium for a human-authored PR with a descriptive body and no linked issue. Already tracked: Review agent: cap missing-authorization severity at Low for human-authored PRs with descriptive bodies #2200 (cap missing-authorization severity at Low for human-authored PRs).

  5. Low/info finding noise — the bot posted 18 inline comments, most at low/info severity, many repeating the same observations across runs. Already tracked: Review agent: never post inline comments for info-severity findings #2287 (never post inline comments for info-severity), Review agent: configurable severity threshold for reported findings #2333 (configurable severity threshold).

Assessment

No novel proposals warranted. The existing backlog comprehensively covers the improvement areas this PR surfaced. The most impactful existing issues for this class of PR are #992 (CI ADR collision lint), #1013 (finding deduplication), and #2200 (missing-authorization severity cap for human PRs). Prioritizing those three would address the main friction points observed here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

component/docs User-facing documentation ready-for-merge All reviewers approved — ready to merge

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants